В Ruby ввод-вывод — это не просто набор команд; это сложная архитектура на основе потоков. В центре этой системы находится класс IO класс, который выступает в качестве двунаправленного канала между вашей программой и внешним миром. Независимо от того, взаимодействуете ли вы с файлом, сетевым сокетом или терминалом пользователя, Ruby рассматривает их как универсальные потоки.
1. Двунаправленный мост
Объект IO является единым абстрактным представлением. Хотя операционная система видит раздельные дескрипторы файлов для чтения и записи (например, в канале), то Ruby объединяет их в один объект. Это позволяет обеспечить бесперебойный обмен данными в обоих направлениях.
2. Ядро и стандартные фильтры
Модуль Kernel предоставляет методы, такие как gets и print. Эти методы по сути являются фильтрами которые делегируют работу глобальным константам STDIN и STDOUT. Это означает, что ваш код можно перенаправить на уровне ОС для обработки файлов или сетевых потоков, не меняя ни одной строки логики.
$$\text{Поток} \rightarrow \text{Буфер} \rightarrow \text{Интерпретатор Ruby}$$